﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Common;
using System.Collections;
using System.Transactions;
using Caixa.DB;
using Caixa.Model;
using Caixa.Model.Enum;
using Caixa.Model.Interface;

namespace Caixa.DAO
{
	public class ClientePessoaJuridicaDAO : PessoaJuridicaDAO
	{
		#region " Methods "

		#region " Get Methods "

		public new static ClientePessoaJuridica GetByID(int id)
		{
			ClientePessoaJuridica p = null;

			// Carrega os dados de PessoaJuridica				
			PessoaJuridica PessoaJuridica = PessoaJuridicaDAO.GetByID(id);
			if (PessoaJuridica != null)
				p = DAHelper.ToModel<PessoaJuridica, ClientePessoaJuridica>(PessoaJuridica);

			using (DAHelper db = new DAHelper())
			{
				string SQL = string.Format(@"
					SELECT 
						{1}, {2}, {3}
					FROM {0}					
					WHERE
						{2} = :{2}
				",
					ClientePessoaJuridica.Fields.TABELA,
					ClientePessoaJuridica.Fields.ID,
					ClientePessoaJuridica.Fields.IDPESSOAJURIDICA,
					ClientePessoaJuridica.Fields.ATIVO
				);

				// Prepara os parâmetros da Query
				List<DbParameter> parms = new List<DbParameter>();
				parms.Add(db.GetParameter(ClientePessoaJuridica.Fields.IDPESSOAJURIDICA, id));

				// Executa a query no Conta de dados
				IEnumerator data = db.SelectSqlDr(SQL, parms.ToArray()).GetEnumerator();

				// Converte o resultado do banco de dados em objeto				
				p = DAHelper.ToModel<ClientePessoaJuridica>(data, p);
			}

			return p;
		}

		public new static bool Existe(int id)
		{
			return (GetByID(id) != null);
		}

		#endregion

		#region " Management Methods "



		#endregion

		#region " DDL Methods "

		public static int Insert(ClientePessoaJuridica p)
		{
			int newID = 0;

			using (TransactionScope transaction = new TransactionScope())
			{
				// Insere a Pessoa
				p.ID = PessoaJuridicaDAO.Insert(p);

				using (DAHelper db = new DAHelper())
				{
					// Prepara os parâmetros da Query
					List<DbParameter> parms = new List<DbParameter>();
					parms.Add(db.GetParameter(ClientePessoaJuridica.Fields.ID, p.ID));
					parms.Add(db.GetParameter(ClientePessoaJuridica.Fields.IDPESSOAJURIDICA, p.ID));
					parms.Add(db.GetParameter(ClientePessoaJuridica.Fields.ATIVO, p.Ativo));

					// Executa a query no banco de dados e retorna o ID do novo registro
					db.InsertSql(ClientePessoaJuridica.Fields.TABELA, parms.ToArray());
					newID = p.ID;
				}

				transaction.Complete();
			}

			return newID;
		}

		public static bool Update(ClientePessoaJuridica p)
		{
			bool success = false;

			using (TransactionScope transaction = new TransactionScope())
			{
				using (DAHelper db = new DAHelper())
				{
					// Prepara os parâmetros da Query
					List<DbParameter> parms = new List<DbParameter>();
					parms.Add(db.GetParameter(ClientePessoaJuridica.Fields.ATIVO, p.Ativo));

					// Define a cláusula where do Update
					string sWhere = string.Format("{0} = {1}", ClientePessoaJuridica.Fields.ID, p.ID);

					// Executa a query no banco de dados e retorna se foi atualizado com sucesso
					success = db.UpdateSql(ClientePessoaJuridica.Fields.TABELA, parms.ToArray(), sWhere);
				}

				// Atualiza a Pessoa
				if (success)
					success = PessoaJuridicaDAO.Update(p);

				if (success)
					transaction.Complete();
			}

			return success;
		}

		public static bool Delete(ClientePessoaJuridica p)
		{
			bool success = false;

			using (TransactionScope transaction = new TransactionScope())
			{
				using (DAHelper db = new DAHelper())
				{
					// Define a cláusula where do Delete
					string sWhere = string.Format("{0} = {1}", ClientePessoaJuridica.Fields.ID, p.ID);

					// Executa a query no Conta de dados e retorna se o registro foi excluido com sucesso
					success = db.DeleteSql(ClientePessoaJuridica.Fields.TABELA, sWhere);
				}

				// Exclui a Pessoa
				if (success)
					success = PessoaJuridicaDAO.Delete(p);

				if (success)
					transaction.Complete();
			}

			return success;
		}

		#endregion

		#endregion
	}
}